|
Concurrent Prologは、1983年に発表された並行論理プログラミング言語である。イスラエルWeizmann研究所のEhud Shapiroにより設計された〔Shapiro, E. ''A subset of Concurrent Prolog and its interpreter''〕。それ以前に開発されたRelational Languageをより単純化し、制限を緩めた言語で、その後の並行論理プログラミング言語に大きな影響を与えた〔Clark, K, L. and Gregory, S. ''PARLOG: a parallel logic programming language''〕〔Ueda, K. ''Guarded Horn Clauses''〕。また、並行論理プログラミングでの様々なプログラミング手法がConcurrent Prolog上で開発された。 == 概要 == Concurrent PrologはPrologから派生した並行プログラミングと並列実行のためのプログラミング言語で、論理変数を介して通信を行う複数の軽量プロセスのネットワークとしてプログラムを記述する。多くの並行プログラミング言語が逐次処理言語に並行実行の機能を追加したものであるのに対して、Concurrent Prologは並行実行が基本で、並行処理を素直に記述できる。 Concurrent Prologの派生言語として、組み込み述語のみをガード部に記述できるように制限してより単純化した Flat Concurrent Prolog(FCP)がある。1983年の発表以降、Shapiroにより様々なFCPのバリエーションが提案され、分析されている〔Shapiro, E. ''The Family of Concurrent Logic Programming Languages''〕。 Concurrent Prologではホーン節にガードを導入した以下のような規則(Clause)の集まりでプログラムを記述する。"|"はコミット演算子と呼ばれる。G はガード部、B はボディ部と呼ばれる。Head、G、Bはそれぞれ原子論理式である。ガード部の条件がない場合、ガード部とコミット演算子は省略できる。 Head :- G1, ..., Gn| B1, ..., Bm. (n,m≧0) Headとガード部はプロセス書き換えのための条件、ボディ部は書き換え後のプロセスを表す。生成されたプロセスは全て並行に実行される。また、各プロセスごとの書き換え条件のチェックも複数の節で並行に実行してよく、コミット時にただ1つの節が選択される(コミッティッド・チョイス)。Prologと異なりバックトラックの機能はない。 プロセス間の通信にはプロセス間で共有する論理変数を使用する。多くの場合、プロセス間の通信には論理変数を含んだリストで表現されたストリームを用いる。ストリームは のようなリストで実現する。論理変数を共有するプロセスの数に制限はないため、ストリーム通信は1対1だけではなく1対Nのブロードキャストなど、様々な形態が可能である。 簡単なプログラム例を以下に示す。2本のストリームをマージして1本のストリームにするプログラムで、Prologと同様、A や Xs など英大文字や"_"で始まる項は変数を表す。mergeの最初の2引数が入力ストリーム、最後が出力ストリームである。 スポンサード リンク
|